package com.ideaaedi.commonds.numeral;

import lombok.extern.slf4j.Slf4j;

import java.math.BigDecimal;
import java.math.RoundingMode;

/**
 * BigDecimal工具类
 *
 * @author <font size = "20" color = "#3CAA3C"><a href="https://gitee.com/JustryDeng">JustryDeng</a></font> <img src="https://gitee.com/JustryDeng/shared-files/raw/master/JustryDeng/avatar.jpg" />
 * @since 2019/7/29 15:37
 */
@Slf4j
public class BigDecimalUtil {

    /**
     * 除 (四舍五入)
     *
     * @param divisored
     *            被除数
     * @param divisor
     *            除数
     * @param scale
     *            精度（0-保留到个位，1-保留一位小数， 2-保留两位小数）
     *
     * @return  结果
     */
    public static String divide(Integer divisored, Integer divisor, int scale) {
        BigDecimal divisoredBigDecimal = new BigDecimal(divisored);
        BigDecimal divisorBigDecimal = new BigDecimal(divisor);
        BigDecimal result =
                divisoredBigDecimal.divide(divisorBigDecimal, scale, RoundingMode.HALF_UP);
        return result.toString();
    }

    /**
     * 除 (四舍五入)
     *
     * @param divisored
     *            被除数
     * @param divisor
     *            除数
     * @param scale
     *            精度（0-保留到个位，1-保留一位小数， 2-保留两位小数）
     *
     * @return  结果
     */
    public static String divide(String divisored, String divisor, int scale) {
        BigDecimal divisoredBigDecimal = new BigDecimal(divisored);
        BigDecimal divisorBigDecimal = new BigDecimal(divisor);
        BigDecimal result =
                divisoredBigDecimal.divide(divisorBigDecimal, scale,  RoundingMode.HALF_UP);
        return result.toString();
    }

    /**
     * 乘 (不进行取舍)
     *
     * @param paramOne
     *            乘数一
     * @param paramTwo
     *            乘数二
     *
     * @return  结果
     */
    public static String multiply(String paramOne, String paramTwo) {
        BigDecimal paramOneBigDecimal = new BigDecimal(paramOne);
        BigDecimal paramTwoBigDecimal = new BigDecimal(paramTwo);
        BigDecimal result = paramOneBigDecimal.multiply(paramTwoBigDecimal);
        return result.toString();
    }

    /**
     * 乘 (四舍五入)
     *
     * @param paramOne
     *            乘数一
     * @param paramTwo
     *            乘数二
     * @param scale
     *            精度（0-保留到个位，1-保留一位小数， 2-保留两位小数）
     *
     * @return  结果
     */
    public static String multiply(String paramOne, String paramTwo, int scale) {
        BigDecimal paramOneBigDecimal = new BigDecimal(paramOne);
        BigDecimal paramTwoBigDecimal = new BigDecimal(paramTwo);
        BigDecimal result = paramOneBigDecimal.multiply(paramTwoBigDecimal)
                .setScale(scale, RoundingMode.HALF_UP);
        return result.toString();
    }

    /**
     * 加 (四舍五入)
     *
     * @param paramOne
     *            加数一
     * @param paramTwo
     *            加数二
     * @param scale
     *            精度（0-保留到个位，1-保留一位小数， 2-保留两位小数）
     *
     * @return  结果
     */
    public static String add(String paramOne, String paramTwo, int scale) {
        BigDecimal paramOneBigDecimal = new BigDecimal(paramOne);
        BigDecimal paramTwoBigDecimal = new BigDecimal(paramTwo);
        BigDecimal result = paramOneBigDecimal.add(paramTwoBigDecimal)
                .setScale(scale, RoundingMode.HALF_UP);
        return result.toString();
    }

    /**
     * 减(四舍五入)
     *
     * @param subtracted
     *            被减数
     * @param subtraction
     *            减数
     * @param scale
     *            精度（0-保留到个位，1-保留一位小数， 2-保留两位小数）
     *
     * @return  结果
     */
    public static String minus(String subtracted, String subtraction, int scale) {
        BigDecimal subtractedBigDecimal = new BigDecimal(subtracted);
        BigDecimal subtractionBigDecimal = new BigDecimal(subtraction);
        BigDecimal result = subtractedBigDecimal.subtract(subtractionBigDecimal)
                .setScale(scale, RoundingMode.HALF_UP);
        return result.toString();
    }

    /**
     * 判断两个数是否相等
     *
     * @param paramOne
     *            第一个参数     *
     * @param paramTwo
     *            第二个参数
     * @return  是否相等
     */
    public static boolean assertEquals(Object paramOne, Object paramTwo) {
        log.info(" paramOne is -> 【{}】 \n paramTwo is -> 【{}】", paramOne, paramTwo);
        BigDecimal paramOneBigDecimal = new BigDecimal(String.valueOf(paramOne));
        BigDecimal paramTwoBigDecimal = new BigDecimal(String.valueOf(paramTwo));
        int result = paramOneBigDecimal.compareTo(paramTwoBigDecimal);
        return result == 0;
    }
}
